// 文件名：deque_producer_consumer.cpp
// 目的：演示使用 std::deque 实现简单的生产者-消费者队列，利用双端高效 push/pop 支撑批量生产与消费。
// 设计要点：
//   - deque 在头尾插入/删除为均摊 O(1)，适合队列场景；
//   - produce(count)：尾部 push_back 批量生成任务；
//   - consume(count)：从头部 pop_front 批量消费任务；
//   - size()：查询当前积压任务数量。
// 注意事项：
//   - 本示例未考虑并发安全；生产者与消费者若在多线程中使用需加锁或采用无锁队列；
//   - 任务负载以简单字符串代替，真实系统可用变体或多字段结构；
//   - 若消费 count 大于队列长度，会提前停止（保护性判空）。
// 复杂度：
//   - produce/consume：O(k)，k 为批次数（每次操作 O(1) 均摊）；
//   - size：O(1)。

#include <deque>
#include <string>
#include <iostream>

struct Task {
    int id;
    std::string payload;
};

class TaskQueue {
public:
    // 批量生产任务：将 count 个任务追加至队尾
    void produce(int count) {
        for (int i = 0; i < count; ++i) {
            tasks_.push_back({nextId_++, "payload"});
        }
        std::cout << "Produced " << count << " tasks\n";
    }

    // 批量消费任务：从队头取出至多 count 个任务
    void consume(int count) {
        for (int i = 0; i < count && !tasks_.empty(); ++i) {
            auto task = tasks_.front();
            tasks_.pop_front();
            std::cout << "Consume task #" << task.id << '\n';
        }
    }

    // 当前积压任务数量
    std::size_t size() const { return tasks_.size(); }

private:
    std::deque<Task> tasks_;
    int nextId_ = 0; // 递增任务 ID
};

int main() {
    TaskQueue queue;
    queue.produce(5);
    queue.consume(3);
    queue.produce(2);
    queue.consume(4);
    std::cout << "Remaining tasks: " << queue.size() << '\n';
    return 0;
}